package day0619;

//引入  文件夹.JFrame文件;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;

public class ZY2 {
    public static void main(String[] args) {
        //1.定义一个变量w指代一个 新建的窗口(用JFrame文件);
        // (默认是隐藏，默认是最小, 默认关不掉)
        JFrame w=new JFrame();
        //3.用JPanel文件床架一个面板对象，存入到变量JPanel p中(用来承载界面上的所有元素)
        JPanel p=new JPanel();

        //9.Layout布局//将默认的布局方式设置为空(没有布局方式了<通过xy坐标给给每个元素设置位置>)
        p.setLayout(null);//set设置，

        //4.用ImageIcon文件创建一个ImageIcon对象存入bg变量中，用来操作"images/背景.jpg"
        ImageIcon bg=new ImageIcon("images/背景.jpg");
        //5.用JLabel文件创建一个对象存入j变量中(表示标签，用来包含背景图)
        JLabel  j=new JLabel();
        //10.给包含背景图的标签设置宽高和坐标
        j.setSize(480,800);//给标签设置宽480,高800);
        j.setLocation(0,0);//给标签设置坐标点为，0,0, Location: 位置  (xy坐标)
        //6.将bg变量指代的背景图设置到标签j中(给标签j设置图片bg//让标签包含图片bg)
        j.setIcon(bg);//给标签j设置图片bg//让标签包含图片bg
        //7.将j变量指代的包含背景图的标签设置到面板p中(给面板p中添加标签j)
        p.add(j);//给面板p中添加标签j


        //11.创建所有的按钮的代码
        //11.1创建一个包含所有图片名字的String[] names数组
        ArrayList<String> names2=new ArrayList<>();
        String[] names={"刷子","剪刀","叉子","奶瓶","干草",
                "手套","树桩", "棉花","毛线","水桶",
                "火", "玉米", "白菜","草" , "萝卜","铃铛"};
        for (int i = 0; i <names.length ; i++) {//将数组元素存入到集合中
             names2.add(names[i]);
        }

        ArrayList<JButton> bottom=new ArrayList<>();
        //ArrayList  finds=new ArrayList();
        ArrayList<JButton> is=new ArrayList<>();
        //11.2创建一个JButton类型的数组is,容量为96，用来存储下边双层for循环创建的96个按钮
        //JButton[]  is=new JButton[96];//用来存储下边双层for循环创建的96个按钮
        //外循环执行0---5次 (6次)， 表示将names.length种按钮创建6遍  (总共6*names.length)
        for(int i=0;i<6;i++){//6*16=96
            //内循环执行names次，表示创建names.length(16)种按钮
            for(int b=0; b<names.length; b++) {
                //创建一个ImageIcon对象存入到 ImageIcon b1Icon变量中
                // 用来操作("images/"+names[b] + ".png"图片
                ImageIcon b1Name = new ImageIcon("images/"+names[b] + ".png");
                //创建一个JButton对象存入到 JButton b1变量中(表示本次循环创建一个一个按钮)
                JButton b1 = new JButton();
                //给按钮设置宽59, 高66
                b1.setSize(59,66);
                //给按钮b1设置图标为b1Icon
                b1.setIcon(b1Name);
                b1.setName(names[b]);
                //将按钮b1存入到is数组的i*16+b位置
                //is[i*16+b]=b1;
                is.add(b1);
            }
        }

        //13.打乱96个按钮的顺序
        Collections.shuffle(is);
        /*Random  rd=new Random();//创建一个随机数工具对象存入到变量Random rd中
        for(int i=0;i<is.size();i++){//循环从0开始到is.length-1结束(执行is.length次)，用于给is.length多个元素打乱顺序
            int num=rd.nextInt(96);//用rd的nextInt()方法产生一个小于96的随机整数存入到num变量中
            //用is[i]元素和is[随机数num]元素交换的三行代码如下：
            JButton t=is[i];//从is取出第i个元素存入到JButton t变量中
            is[i]=is[num];//将is[num]的值赋值给is[i]
            is[num]=t;//将变量t中存储的按钮赋值给is[num]
        }*/





        //12.第一层按钮
        for(int i=0;i<42;i++){//此for循环从0开始循环到41结束(执行42次)，用于从is数组中取出42个按钮
            JButton b=is.get(i);//   is[i];//从is数组中取出一个按钮is[i]存入到变量JButton b(放到界面上)
            int x=30+i%7*59;//int x=30+i%7*59;//计算此按钮的x坐标//59是按钮宽度
            int y=100+i/7*66;//int y=100+i/7*66;//计算此按钮的y坐标//66是按钮宽度
            b.setLocation(x,y);//将xy坐标设置给按钮b
            p.add(b,0);//将按钮b添加到面板p的第0层
        }






        //12.第二层按钮
        for(int i=42;i<72; i++){//此for循环从42开始循环到71结束(执行30次)，用于从is数组中取出30个按钮
            JButton b=is.get(i);//is[i];//从is数组中取出一个按钮is[i]存入到变量JButton b(放到界面上)
            int x=60+(i-42)%6*59;//int x=60+(i-42)%6*59;//计算此按钮的x坐标//59是按钮宽度
            int y=133+(i-42)/6*66;//int y=133+(i-42)/6*66;//int y=100+i/7*66;//计算此按钮的y坐标//66是按钮宽度
            b.setLocation(x,y);//将xy坐标设置给按钮b
            p.add(b,0);//将按钮b添加到面板p的第0层
        }


        //12.第三层按钮
        for(int i=72;i<96; i++){//第二层： 4行6列
            //从is数组中取出一个按钮(放到界面上)
            JButton b=is.get(i);//=is[i];
            int x=55+(i-72)%6*59;//59是按钮宽度
            int y=166+(i-72)/6*66;//66是按钮宽度
            b.setLocation(x,y);
            p.add(b,0);
        }


        for(int i=0; i< is.size()-2 ;i++){//此for循环从0循环到is.length-2 用来获取当前元素 is[i](判断is[i]是否被覆盖)
            for(int n=i+1;  n<is.size(); n++){//此for循环变量n从n+1循环到is.length-1 用来判断is[n]是否覆盖了is[i]按钮
                //注：内层for循环用来获取当前元素后边的所有元素(is[i+1]到is[is.length-1]之间的所有按钮)
                //is[n]覆盖is[i]时的左边线(is[n]在最左侧处覆盖is[i]的x坐标值)
                int x1= is.get(i).getX()- is.get(n).getWidth();
                //is[n]覆盖is[i]时的右边线(is[n]在最右侧处覆盖is[i]的x坐标值)
                int x2=is.get(i).getX()+ is.get(n).getWidth();
                //is[n]覆盖is[i]时的上边线(is[n]在最上侧处覆盖is[i]的y坐标值)
                int y1=is.get(i).getY()- is.get(n).getHeight();
                //is[n]覆盖is[i]时的下边线(is[n]在最下侧处覆盖is[i]的y坐标值)
                int y2=is.get(i).getY()+ is.get(n).getHeight();
                if(x1<is.get(n).getX()&&is.get(n).getX()<x2 && y1<is.get(n).getY()&&is.get(n).getY()<y2){
                    is.get(i).setEnabled(false);//用setEnabled(false);将按钮is[i]  //注： set 设置  enable是否可用
                }

            }
        }





        //ArrayList<JButton> cards = new ArrayList<>();
        for (int i=0 ;i< is.size(); i++){
            JButton card = is.get(i);
            int i2=i;
            //给当前获取到的按钮添加一个点击监听
            card.addActionListener(

                    //第141到144行  (e可以用来获取点击的按钮的一些信息 )
                    e -> {
                        JButton selected = (JButton) e.getSource();//用e获取点击的按钮   Source源
                       // System.out.println("点击：" + selected.getName());//打印按钮的名字

                        //bottom集合用来存储7个按钮(最多有7个)
                        //bottom如果存满了7个按钮则游戏结束(用return结束当前点击按钮的处理效果<还可以关闭窗口>)
                        if(bottom.size()==7){//show：显示    消息：Message  对话框：Dialog(在一个消息框中显示文字)
                            JOptionPane.showMessageDialog(selected,"槽子满了，游戏结束，请重新开始游戏");
                            return;
                        }
                        //从is集合中的96个按钮中删除当前单机的按钮
                        is.remove(selected);
                        //给当前点击的按钮selected修改xy坐标(坐标设置到7个按钮的槽子位置)
                        selected.setLocation(25+  bottom.size()*selected.getWidth()  ,640);
                        //更新界面
                        p.repaint();
                        //用select按钮获取当前点击按钮的所有监听器，再用[0]取出第0个监听器(因为只给按钮设置了一个监听器)
                        //监听器用ActionListener实现的
                        ActionListener  l=selected.getActionListeners()[0];//获取当前按钮所有的点击效果中的第0个存入到l变量
                        selected.removeActionListener(l);//从当前点击按钮select中删除单机效果l


                        bottom.add(selected);//将当前点击按钮添加到 只能添加7个按钮的集合中bottom
                        int count=1;//用来统计相同按钮个数的变量count
                        //System.out.println("bottom.size()-1::"+  (bottom.size()-1) );
                        //finds.clear();//finds集合用来存储相同按钮的序号
                        JButton  b1=null;
                        JButton  b2=null;
                        for(int r=0; r<bottom.size()-1; r++){//从可以存储7个按钮的bottom集合中取出每个按钮和当前按钮selected
                            JButton  other=bottom.get(r);//比较按钮名字
                            if(other.getName().equals(selected.getName())){
                                //如果按钮名字相同则将bottom中相同按钮的序号存入到b1或b2变量中
                                if(b1==null){//如果b1变量为空则，存入到b1变量中
                                    b1=other;
                                }else{//否则存入b2变量中
                                    b2=other;
                                }
                                //count++;//finds中并让统计相同按钮个数的变量count自增1
                                //finds.add(r);
                            }
                        }

                        //如果b1变量中存储了按钮，b2变量中也存储了按钮(select变量肯定存储了当前点击的按钮)
                        //则此时可以删除这三个按钮
                        if(b1!=null && b2!=null){
                            //从可以存储7个按钮的bottom集合中删除三个按钮
                            bottom.remove(b1);
                            bottom.remove(b2);
                            bottom.remove(selected);
                            //从界面中的面板p中删除三个按钮
                            p.remove(b1);
                            p.remove(b2);
                            p.remove(selected);
                            p.repaint();//更新面板p的内容
                        }
                       /* if(count>=2){//如果从bottom集合中 找到一个和当前点击的select按钮相同的按钮
                            for(int h=0; h<finds.size(); h++){
                                int index=(int)finds.get(h);//从finds中取出相同按钮的序号
                                JButton b=bottom.remove(index);//根据相同按钮的序号index从bottom中删除相同的按钮
                                p.remove(b);//从界面中将相同按钮也删除
                                p.repaint();//更新界面
                            }
                            //将当前点击的按钮selected也删除
                            bottom.remove(selected);//从bottom中删除当前点击的按钮
                            p.remove(selected);//从界面中删除当前点击的按钮
                            p.repaint();//更新界面
                        }*/


                        //集合的长度size()， 数组的长度length,   字符串的长度length()
                        for(int m=0; m<bottom.size() ; m++){
                            //从bottom中取出一个按钮b
                            JButton b=bottom.get(m);
                            //给此按钮b设置一个新的xy坐标值
                            // (y坐标都相同表示他们处于一条水平线，x坐标是：按钮序号*按钮宽度+25)
                            b.setLocation(25+  m*selected.getWidth()  ,640);
                        }







                    }

            );
        }





        //8.将面板p添加到窗口w中(窗口包含面板)
        w.add(p);

        //2.设置窗口属性
        w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认Default  关闭Close  操作Operation
        w.setSize(480,800);//设置窗口w的尺寸(宽，高)
        w.setVisible(true);//设置w代表的窗口显示(出来), true代表显示// Visible:显示
    }
}


















/*                        boolean delete=false;
                        for (int k=0;k<bottom.size(); k++) {
                            JButton  other=bottom.get(k);
                            if(selected.getName().equals(other.getName())){
                                System.out.println(bottom.remove(other));
                                System.out.println(bottom.size()+"remove before:"+bottom);
                                //System.out.println(bottom.remove(selected));
//                                for (JButton b:bottom){
//                                    System.out.println( b.equals(selected) );
//                                    System.out.println( b.equals(other) );
//                                }
                                System.out.println(bottom.size()+"remove after:"+bottom);
                                p.remove(other);
                                //p.remove(selected);
                                p.repaint();
                                delete=true;
//                                System.out.println(bottom.get(bottom.size()-1).getName());
                            }
                        }

                        bottom.add(selected);
                        if(delete==true){
                            System.out.println(bottom.remove(selected));
                            p.remove(selected);
                            p.repaint();
                        }*/


                       /* int count=1;
                        //System.out.println("bottom.size()-1::"+  (bottom.size()-1) );
                        for(int r=0; r<bottom.size()-1; r++){
                            JButton  other=bottom.get(r);
                            if(other.getName().equals(selected.getName())){
                                count++;
                                finds.add(r);
                            }
                        }

                        System.out.println(finds.size()+"|||"+finds+"::"+count);
                        if(count>=2){
                            try {
                                Thread.sleep(900);
                            } catch (InterruptedException interruptedException) {
                                interruptedException.printStackTrace();
                            }
                            for(int h=0; h<finds.size(); h++){
                                int index=(int)finds.get(h);
                                System.out.println(index);
                                JButton b=bottom.remove(index);
                                p.remove(b);
                                p.repaint();
                            }
                            bottom.remove(selected);
                            p.remove(selected);
                            p.repaint();

                        }*/

























//for (int k = 0; k <bottom.size() ; k++) {

                            /*int count=0;
                            for(int m=k+1;  m<bottom.size(); m++){
                                JButton after=bottom.get(k);
                                if(now.equals(after)){
                                    count++;
                                }
                            }

                            if(count>=2){
                                for (int n = 0; n <bottom.size() ; n++) {
                                    JButton  other=bottom.get(n);
                                    if(now.getName().equals(other.getName())){
                                        bottom.remove(other);
                                    }
                                }
                                p.repaint();
                            }
*/
// }